/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package JPA;

import DAO.ProyectoDAO;
import domain.Entity.EntityGestor;
import domain.Entity.EntityProyecto;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.transaction.UserTransaction;

/**
 *
 * @author jorge
 */
public class JPAProyectoDAO implements ProyectoDAO {
    

    
    public void anadirProyecto(EntityProyecto ep) {
       try {
            Context ctx = new InitialContext();
            UserTransaction utx = (UserTransaction) ctx.lookup("java:comp/env/UserTransaction");


        try {
            utx.begin();
            EntityManager em = (EntityManager) ctx.lookup("java:comp/env/persistence/baronPU");
            EntityGestor eg = em.find(domain.Entity.EntityGestor.class, ep.getEg().getDni());
            eg.getEpy().add(ep);
            em.persist(ep);
            utx.commit();
        } catch (Exception ex) {
            try {
                utx.rollback();
            } catch (Exception exe) {
                System.out.println("Rollback failed: "+exe.getMessage());
                }
              }
             } catch (NamingException ex) {
            Logger.getLogger(JPAProyectoDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public EntityProyecto obtenerProyecto(String nombre) {
           EntityProyecto ep = new EntityProyecto();
       try {
            Context ctx = new InitialContext();
            EntityManager em = (EntityManager) ctx.lookup("java:comp/env/persistence/baronPU");
            
            Query q = em.createQuery("SELECT p FROM EntityProyecto p WHERE p.nombreProyecto = :nombre");
            q = q.setParameter("nombre", nombre);
            List resultado = q.getResultList();
            if(resultado.size() > 0){
                
                  ep = (EntityProyecto) resultado.remove(0);
                
            }
             } catch (NamingException ex) {
            Logger.getLogger(JPAProyectoDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        
    return ep;
    }

    public List ProyectosGestor(Long dni) {
     List resultado = new ArrayList();
       try {
            
            Context ctx = new InitialContext();
            //UserTransaction utx = (UserTransaction) ctx.lookup("java:comp/env/UserTransaction");
            EntityManager em = (EntityManager) ctx.lookup("java:comp/env/persistence/baronPU");
            Query q = em.createQuery("SELECT p FROM EntityProyecto p WHERE p.eg.dni = :dni");
            q = q.setParameter("dni", dni);
            resultado = q.getResultList();
             } catch (NamingException ex) {
            Logger.getLogger(JPAProyectoDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        
        
    return resultado;
    }
    
    public void borrarProyecto(Long idProyecto) {
        EntityProyecto ep = new EntityProyecto();
        try {
            Context ctx = new InitialContext();
            UserTransaction utx = (UserTransaction) ctx.lookup("java:comp/env/UserTransaction");


        try {
            utx.begin();
            EntityManager em = (EntityManager) ctx.lookup("java:comp/env/persistence/baronPU");
            ep = em.find(domain.Entity.EntityProyecto.class, idProyecto);
            em.remove(ep);
            utx.commit();
        } catch (Exception ex) {
            try {
                utx.rollback();
            } catch (Exception exe) {
                System.out.println("Rollback failed: "+exe.getMessage());
                }
              }
             } catch (NamingException ex) {
            Logger.getLogger(JPAProyectoDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
     }

    public void modificarProyecto(EntityProyecto ep) {
        try {
            Context ctx = new InitialContext();
            UserTransaction utx = (UserTransaction) ctx.lookup("java:comp/env/UserTransaction");


        try {
            utx.begin();
            EntityManager em = (EntityManager) ctx.lookup("java:comp/env/persistence/baronPU");
            EntityProyecto proyecto = em.find(domain.Entity.EntityProyecto.class, ep.getIdProyecto());
            proyecto.setNombreProyecto(ep.getNombreProyecto());
            proyecto.setDescripcion(ep.getDescripcion());
            proyecto.setPrecio_hora(ep.getPrecio_hora());
            proyecto.setHoras_maximas(ep.getHoras_maximas());
            proyecto.setFecha_ini(ep.getFecha_ini());
            proyecto.setFecha_fin(ep.getFecha_fin());
            proyecto.setCompletado(ep.isCompletado());
            utx.commit();
        } catch (Exception ex) {
            try {
                utx.rollback();
            } catch (Exception exe) {
                System.out.println("Rollback failed: "+exe.getMessage());
                }
              }
             } catch (NamingException ex) {
            Logger.getLogger(JPAProyectoDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public EntityProyecto obtenerProyecto(long idProyecto) {
       EntityProyecto ep = new EntityProyecto();
        try {
            Context ctx = new InitialContext();
            UserTransaction utx = (UserTransaction) ctx.lookup("java:comp/env/UserTransaction");


        try {
            utx.begin();
            EntityManager em = (EntityManager) ctx.lookup("java:comp/env/persistence/baronPU");
            ep = em.find(domain.Entity.EntityProyecto.class, idProyecto);
            utx.commit();
        } catch (Exception ex) {
            try {
                utx.rollback();
            } catch (Exception exe) {
                System.out.println("Rollback failed: "+exe.getMessage());
                }
              }
             } catch (NamingException ex) {
            Logger.getLogger(JPAProyectoDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
       return ep; 
    }
    
    
}
